package reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @author yuisama
 * @version 1.0.0
 * @Description TODO
 * @createTime 2023年04月11日 20:53:00
 */
public class ReflectTest {
    public static void main(String[] args) throws Exception{
        // 1.要用反射操作某个类，先获取该类的class对象
        // 获取Class对象的三种方式
        Class<Student> cls2 = Student.class;
        // 2.通过反射产生Student类的对象
//        Constructor<Student>[] constructors = (Constructor<Student>[]) cls2.getDeclaredConstructors();
//        System.out.println(Arrays.toString(constructors));
//        // 获取私有的有参构造
//        Constructor<Student> constructor = cls2.getDeclaredConstructor(String.class,int.class);
//        // 破坏封装性
//        constructor.setAccessible(true);
//        Student stu2 = constructor.newInstance("铭哥",18);
//        Student stu3 = constructor.newInstance("呵呵",20);
//        System.out.println(stu2);
//        System.out.println(stu3);
        Method[] methods = cls2.getDeclaredMethods();
        System.out.println(Arrays.toString(methods));
        // 通过反射来调用普通方法与静态方法
        // 调用普通方法都要产生对象
        Student student = cls2.newInstance();
        Method methodFun = cls2.getDeclaredMethod("fun",int[].class);
        // 通过Method反射对象调用fun方法
        methodFun.invoke(student,new int[]{1,3,5,7,9});
        // 通过反射调用静态方法
        Method methodTest = cls2.getDeclaredMethod("test");
        methodTest.invoke(null);

    }
}
